import dayjs from 'dayjs';

export const formatTime = (date, template) => dayjs(date).format(template);

/**
 * 格式化价格数额为字符串
 * 可对小数部分进行填充，默认不填充
 * @param price 价格数额，以分为单位!
 * @param fill 是否填充小数部分 0-不填充 1-填充第一位小数 2-填充两位小数
 */
export const priceFormat = (price, fill = 0) => {
  if (isNaN(price) || price === null || price === Infinity) {
    return price;
  }

  let priceFormatValue = Math.round(parseFloat(`${price}`) * 10 ** 8) / 10 ** 8; // 恢复精度丢失
  priceFormatValue = `${Math.ceil(priceFormatValue) / 100}`; // 向上取整，单位转换为元，转换为字符串
  if (fill > 0) {
    // 补充小数位数
    if (priceFormatValue.indexOf('.') === -1) {
      priceFormatValue = `${priceFormatValue}.`;
    }
    const n = fill - priceFormatValue.split('.')[1]?.length;
    for (let i = 0; i < n; i++) {
      priceFormatValue = `${priceFormatValue}0`;
    }
  }
  return priceFormatValue;
};

/**
 * 获取cdn裁剪后链接
 *
 * @param {string} url 基础链接
 * @param {number} width 宽度，单位px
 * @param {number} [height] 可选，高度，不填时与width同值
 */
export const cosThumb = (url, width, height = width) => {
  if (url.indexOf('?') > -1) {
    return url;
  }

  if (url.indexOf('http://') === 0) {
    url = url.replace('http://', 'https://');
  }

  return `${url}?imageMogr2/thumbnail/${~~width}x${~~height}`;
};

export const get = (source, paths, defaultValue) => {
  if (typeof paths === 'string') {
    paths = paths.replace(/\[/g, '.').replace(/\]/g, '').split('.').filter(Boolean);
  }
  const { length } = paths;
  let index = 0;
  while (source != null && index < length) {
    source = source[paths[index++]];
  }
  return source === undefined || index === 0 ? defaultValue : source;
};
let systemWidth = 0;
/** 获取系统宽度，为了减少启动消耗所以在函数里边做初始化 */
export const loadSystemWidth = () => {
  if (systemWidth) {
    return systemWidth;
  }

  try {
    ({ screenWidth: systemWidth, pixelRatio } = wx.getSystemInfoSync());
  } catch (e) {
    systemWidth = 0;
  }
  return systemWidth;
};

/**
 * 转换rpx为px
 *
 * @description
 * 什么时候用？
 * - 布局(width: 172rpx)已经写好, 某些组件只接受px作为style或者prop指定
 *
 */
export const rpx2px = (rpx, round = false) => {
  loadSystemWidth();

  // px / systemWidth = rpx / 750
  const result = (rpx * systemWidth) / 750;

  if (round) {
    return Math.floor(result);
  }

  return result;
};

/**
 * 手机号码*加密函数
 * @param {string} phone 电话号
 * @returns
 */
export const phoneEncryption = (phone) => {
  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
};

// 内置手机号正则字符串
const innerPhoneReg = '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$';

/**
 * 手机号正则校验
 * @param phone 手机号
 * @param phoneReg 正则字符串
 * @returns true - 校验通过 false - 校验失败
 */
export const phoneRegCheck = (phone) => {
  const phoneRegExp = new RegExp(innerPhoneReg);
  return phoneRegExp.test(phone);
};

/**
 * @method debounce 防抖动
 * @param {Function} func 回调方法
 * @param {Number} wait 延迟时间，默认300毫秒
 * */
let timer = null;
export const debounce = (func, wait = 300) => {
  timer && clearTimeout(timer);
  timer = setTimeout(func, wait);
};

/**
 * @method removeEmpty 去除空值字段
 * @param {Object} obj 对象
 * */
export const removeEmptyParam = (obj) => {
  const newObj = {};
  Object.keys(obj).map((key) => {
    (obj[key] || obj[key] === 0) && (newObj[key] = obj[key]);
  });
  return newObj;
};

/**
 * @method toast 消息提示
 * @params {String} title 提示语
 * @params {Object} 其他可配置项
 * */
export const toast = (title = '错误', obj = {}) => {
  wx.showToast({
    title: title,
    icon: 'none',
    duration: 1500,
    ...obj,
  });
};

/**
 * @method loading 加载提示
 * @param {String} title 文字
 * */
export const loading = (title = '加载中...') => {
  wx.showLoading({
    title: title,
    mask: true,
  });
};

/**
 * @method errorModal 错误提示
 * @param {String} content 文字
 * */
export const errorModal = (content = '系统异常', opts = {}) => {
  return new Promise((resolve, reject) => {
    wx.showModal({
      title: '提示',
      showCancel: false,
      confirmText: '我知道了',
      content,
      ...opts,
      success: (res) => {
        if (res.confirm) resolve();
        else if (res.cancel) reject();
      },
      fail: () => {
        reject();
      },
    });
  });
};

/**
 * @method updateManager 强制更新
 * */
export const updateManager = () => {
  // 强制更新
  const updateManager = wx.getUpdateManager();
  updateManager.onUpdateReady(function () {
    wx.showModal({
      title: '更新提示',
      content: '新版本已经准备好，是否重启应用？',
      showCancel: false,
      success: function (res) {
        if (res.confirm) {
          updateManager.applyUpdate();
        }
      },
    });
  });
};

/**
 * @method getCurrentPageUrl 获取当前页面栈地址及参数
 * */
export const getCurrentPageUrl = () => {
  const pages = getCurrentPages();
  const { route, options } = pages[1] ? pages[1] : pages[0];
  let params = '';
  Object.keys(options).forEach((i) => {
    params += `${i}=${options[i]}&`;
  });
  params && (params = `?${params.substring(0, params.length - 1)}`);
  return `/${route}${params}`;
};

/**
 * 设置/获取全局变量
 * */
const globalData = {};
export const defineGlobal = {
  set: (key, val) => {
    globalData[key] = val;
  },
  get: (key) => {
    return globalData[key];
  },
};
// module.exports = {};
